# 9.2
# 把大问题拆卸成小问题map解决，把得出来的结果reduce合并

def mj(r):
    return 3.14 * r ** 2

x=[13,4,2,4,6,7,2,9,4]
m=map(mj,x)
print(list(m))

from functools import reduce

def fr(x,y):
    return x * y

x=[1,2,3,4,5,6]
y=reduce(fr, x)
print(y)


# 9.3
# 构造一个计算绝对值的生成器。
def abs_generator(iterable):
    for item in iterable:
        yield abs(item)

# 使用示例
numbers = [1, -2, 3, -4, 5]
abs_values = abs_generator(numbers)

for value in abs_values:
    print(value)


# 构造一个简化版计算绝对值的生成器
# 定义一个列表
numbers = [1, -2, 3, -4, 5]

# 使用生成器表达式构造计算绝对值的生成器
abs_generator = (abs(x) for x in numbers)

# 遍历生成器并打印结果
for value in abs_generator:
    print(value)

# 9.5 栈和队列
# eg1. 构造一个栈，并在其中增加、删除元素
d = [2, 6, 3]
print(d)
d.append(9)
print(d)
d.pop()
print(d)

# eg2. 构造一个队列，在其中增加、删除元素
from collections import deque
d = deque([3, 4, 5])
print(d)
d.append(9)
print(d)
d.popleft()
print(d)

# 9.6

def print_msg(msg):
    def printer():
        print(msg)
    printer()

print_msg("Hello, World!")

# 9.6 闭包
# 构造一个闭包程序，能够根据需要计算平方/立方。
def jisuan(fang):
    def runfang(shuzhi):
        return shuzhi ** fang
    return runfang

lifang = jisuan(3)
print(lifang(5))

pingfang = jisuan(2)
print(pingfang(5))

# 9.7 装饰器
# 设计一个装饰器，能够计算圆面积、正方形面积。
def decorator(function):
    def wrapper(*args, **kwargs):
        result = function(*args, **kwargs)
        return result
    return wrapper
@decorator
def yuanmianji(r):
    return 3.14 * r ** 2
@decorator
def zfxmianji(a):
    return a ** 2
print("=========9.7==========")
print(yuanmianji(3))
print(zfxmianji(6))